import {
  ASSET_TYPES
} from 'shared/constants'
import {
  isPlainObject
} from '../util/index'

export function initAssetRegisters(Vue) {
  ASSET_TYPES.forEach(type => {
    // 挂载 component directive filter 属性
    Vue[type] = function (id, definition) {
      // 如果没有definition
      if (!definition) {
        // 直接返回当前实例options的对应属性
        return this.options[type + 's'][id]
      } else {
        // 如果是component 并且 definition 是对象
        if (type === 'component' && isPlainObject(definition)) {
          // 初始化name属性
          definition.name = definition.name || id
          // 这里组件继承Vue this.options._base -> vm
          definition = this.options._base.extend(definition)
        }
        // TODO:暂时不考虑实现directive
        // if(type==='directive' && typeof definition==='function'){
        //   definition={bind:definition,update:definition}
        // }
        // 在当前实例options[type + 's'][id]属性上缓存definition
        this.options[type + 's'][id] = definition
        // 返回definition
        return definition
      }
    }
  })
}